java这个代码什么时候崩溃?
这段代码来自我使用的一个库,由于一个错误,我进行了反编译
在Windows 32上,如果启动程序的用户是计算机管理员,则该程序可以正常工作,否则会崩溃。在linux上也会崩溃
/* */ public static String cambiaEstensione(String nomeFile, String nuovaEstensione)
/* */ {
/* 140 */ int p = nomeFile.lastIndexOf('.');
/* 141 */ if (p < 0) {
/* 142 */ return nomeFile + "." + nuovaEstensione;
/* */ }
/* 144 */ return nomeFile.substring(0, p) + "." + nuovaEstensione;
/* */ }
函数的调用方是:
/* 182 */ if (this.fl_scrivi) {
/* 183 */ stato = "Apertura archivio dichiarazioni da inviare...";
/* 184 */ this.dcm = new Dcm();
/* 185 */ this.dcm.setNomeDcm(Util.cambiaEstensione(args[2], "dcm"));
/* 186 */ this.dcm.setFileDcm(new FileOutputStream(this.dcm.getNomeDcm()));
/* */ }
例外情况是:
java.io.FileNotFoundException: .dcm (Accesso negato)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at it.finanze.entrate.sco.main.M77S11.elaboraFile(M77S11.java:186)
其中“Accesso negato”表示“拒绝访问”
你能帮我理解错误的原因吗
更新:问题的原因是我在args[2]
中传递了一个空字符串
在Windows中拥有管理员权限,它没有崩溃,因为它创建了文件{{CD2>},不确定是否必须考虑这个特性或bug。
非常感谢所有回答的人
# 1 楼答案
调用
this.dcm.getNomeDcm()
返回字符串".dcm"
(无论出于何种原因),并且不存在具有该名称的文件。这并不奇怪,因为Windows应用程序通常不会仅使用这样的扩展名命名文件# 2 楼答案
就在堆栈跟踪中
它找不到名为“.dcm”的文件,所以看起来:
或者调用函数为文件名传递了一个空字符串,换句话说,args[2]在这一行返回一个空字符串
或(因为这在Linux上发生)args[2]包含一个类似“.something”的值,所以这一行
返回零,然后是这一行
只返回空字符串+“+扩大(即“.dcm”)
Linux使用“.filename”来表示隐藏的文件
# 3 楼答案
你应该检查文件是否真的存在,是否有正确的权限
# 4 楼答案
不懂Java,但看起来您收到了一个拒绝访问的错误(“Java.io.FileNotFoundException:.dcm(Accesso negato)”)
你确定你有正确的访问权限吗
# 5 楼答案
我猜“Accesso negato”意味着你没有打开文件的权限。您可以尝试将文件移动到另一个目录,以管理员身份运行程序,或更改所需的权限
在linux上,您可以使用
ls -l <file>
检查权限 并使用chmod 666 <file>
(所有人的读写权限)更改它们另见chmod
# 6 楼答案
如果
nomeFile
是空字符串,则返回-1,且以下条件为真:这将返回一个空字符串、一个点和传入的文件扩展名的浓缩,从而返回“.dmc”。具有此名称的文件似乎不存在